package br.uvv.Service;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.primefaces.model.SortOrder;

import br.uvv.Dao.ClientePortalDAO;
import br.uvv.Dao.PerfilDAO;
import br.uvv.Dao.UsuarioDAO;
import br.uvv.Enums.SituClientePortal;
import br.uvv.Enums.SituUsuario;
import br.uvv.Model.ClientePortal;
import br.uvv.Model.Perfil;
import br.uvv.Model.Usuario;
import br.uvv.Util.CorreioEletronico;
import br.uvv.Util.CriptoHashUtil;
import br.uvv.Util.DAOException;
import br.uvv.Util.MsgUtil;
import br.uvv.Util.RNException;
import br.uvv.Util.Util;

public class SolicitacaoCadastroService implements Serializable {

	private static final long serialVersionUID = -6134028495333420094L;

	private Perfil selecionarPerfilAdministradorCliente(){
		PerfilDAO perfilDAO = new PerfilDAO();
		try {
			return (Perfil) perfilDAO.selecionar(2l);
		} catch (DAOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private Perfil selecionarPerfilUsuario(){
		PerfilDAO perfilDAO = new PerfilDAO();
		try {
			return (Perfil) perfilDAO.selecionar(3l);
		} catch (DAOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public ClientePortal selecionarClientePortal(Long id) throws RNException {
		ClientePortalDAO clientePortalDAO = new ClientePortalDAO();
		try {
			return (ClientePortal) clientePortalDAO.selecionar(id);
		} catch (DAOException e) {
			throw new RNException(e);
		}
	}
	
	public List<ClientePortal> listarClientePortal(int first, int pageSize,
			String sortField, SortOrder sortOrder, String varBuscaClientePortal) throws RNException {
		ClientePortalDAO clientePortalDAO = new ClientePortalDAO();
		try {
			return (List<ClientePortal>) clientePortalDAO.listar(first, pageSize, sortField, sortOrder, varBuscaClientePortal);
		} catch (DAOException e) {
			throw new RNException(e);
		}
	}

	public Integer pedidoCount(String varBuscaClientePortal) {
		ClientePortalDAO clientePortalDAO = new ClientePortalDAO();
		try {
			return clientePortalDAO.count(varBuscaClientePortal);
		} catch (DAOException e) {
			return 0;
		}
	}

	public void salvarClienteAndUsuario(ClientePortal clientePortalInstance,
			Usuario usuarioInstance) throws RNException {
		try {
			ClientePortalDAO clientePortalDAO = new ClientePortalDAO();
			UsuarioDAO usuarioDAO = new UsuarioDAO();
			usuarioInstance.setPerfil(selecionarPerfilAdministradorCliente());
			usuarioInstance.setSituacao(SituUsuario.PendenteAtivacaoEmail);
			String token = CriptoHashUtil.hash("SHA1", usuarioInstance.getEmail().toLowerCase());
			usuarioInstance.setToken(token);
			usuarioDAO.salvar(usuarioInstance);
			clientePortalInstance.setResponsavel(usuarioInstance);
			clientePortalInstance.setSituacao(SituClientePortal.PendenteAtivacaoEmail);
			clientePortalInstance.setDataCadastro(new Date());
			clientePortalDAO.salvar(clientePortalInstance);
			usuarioInstance.setCliente(clientePortalInstance);
			usuarioDAO.salvar(usuarioInstance);
			enviarEmail(usuarioInstance, token);
		} catch (DAOException e) {
			throw new RNException(e);
		}
	}

	public void salvarUsuario(Usuario usuarioInstance) throws RNException {
		UsuarioDAO usuarioDAO = new UsuarioDAO();
		usuarioInstance.setPerfil(selecionarPerfilUsuario());
		usuarioInstance.setSituacao(SituUsuario.PendenteAtivacaoEmail);
		String token = CriptoHashUtil.hash("SHA1", usuarioInstance.getEmail().toLowerCase());
		usuarioInstance.setToken(token);
		try {
			usuarioDAO.salvar(usuarioInstance);
			enviarEmail(usuarioInstance, token);
		} catch (DAOException e) {
			throw new RNException(e);
		}
	}
	
	private void enviarEmail(Usuario usuarioInstance, String token){
		String link = Util.gerarLinkAtivacao() + token;
		String msg = MsgUtil.getMensagem("EmailAtivacao_Mensagem", link);
		try {
			CorreioEletronico mail = new CorreioEletronico();
			mail.setDe("hermann.neto@geen.com.br");
			mail.setTitulo(MsgUtil.getMensagem("EmailAtivacao_Titulo"));
			mail.setMensagem(msg);
			mail.setPara(usuarioInstance.getEmail());
			mail.send();
			UsuarioDAO dao = new UsuarioDAO();
			usuarioInstance.setEmailEnviado(true);
			dao.salvar(usuarioInstance);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
